/*
 * @(#)ModAuth.java 1.00 27 Ago 2007
 *
 * Copyright (c) 2005-2007 Soluciones Info Móviles S.A.C.
 * Av. Javier Prado Oeste 203 - Piso 13, Lima 27, Perú.
 * Todos los derechos reservados.
 */
package sim.auth;

import sim.framework.*;
import sim.forms.*;
import sim.framework.io.*;

import sim.utils.*;
import sim.pref.DocPref;

/**
 * Clase que permite obtención de los datos de la cadena de autenticación.
 *
 * @author      Omar Quintana
 * @since       1.0
 */
public final class ModAuth extends ModForm {
    
    private static final int AUTH_MAX_LEN = 64;

    private static final int MOD_LOGIN = 1;

    private StringBuffer m_StrLogin;  // almacena el resultado obtenido del form
    private DocAuth m_DocAuth;
    
    public ModAuth(int i, Simlet s) {
        super(i, s);
        m_StrLogin = new StringBuffer(AUTH_MAX_LEN);
    }
    
    protected Form formCreate() {
	return Form.create(m_Simlet, FileNames.FORM_AUTH);
    }
    
    protected String formTitleLabel(final FrmNode node) {
        return getLabel(Resource.LBL_TITLE_APP);
    }
    
    protected String formBQuitLabel(final FrmNode node) {
        return getLabel(Resource.LBL_CTRL_PREF);
    }
    
    protected Module createModule(int id) {
	Module m = null;
	switch(id) {
	case ModAuth.MOD_LOGIN:
	    m = new ModAuthLogin(m_modID, m_Simlet);
	    break;
	default:
	    m = super.createModule(id);
	}
	return m;
    }

    public void work(final Msg msg) {

	//#ifdef DEBUG_MODAUTH
	//# System.out.println("ModAuht::work() ENTERED");
	//#endif
        switch (msg.getWParam()) {
	case Executable.STATE_INIT:
	    //#ifdef DEBUG_MODAUTH
	    //# System.out.println("\tExecutable.STATE_INIT");
	    //#endif
	    // Recuperar el documento. Si no éxiste ...
	    m_DocAuth = (DocAuth)getDocument(Simlet.MOD_AUTH);
	    if (m_DocAuth == null) {
		//#ifdef DEBUG_MODAUTH
		//# System.out.println("\tCrear documento");
		//#endif
		// ... crear el documento
		m_DocAuth = new DocAuth(m_Simlet);
		setDocument(Simlet.MOD_AUTH, m_DocAuth);
	    }
                
	    // Si el documento puede no puede ser cargado ...
	    if (!m_DocAuth.load()) {
		//#ifdef DEBUG_MODAUTH
		//# System.out.println("\tEjecutar formulario");
		//#endif
		// Capturar información desde un formulario.
		super.work(msg);
	    }
	    else {
		//#ifdef DEBUG_MODAUTH
		//# System.out.println("\tDocumento cargado, continuar");
		//#endif
		execNext();
	    }                
	    break;
	case Executable.STATE_BACK:
	    //#ifdef DEBUG_MODAUTH
	    //# System.out.println("\tExecutable.STATE_BACK");
	    //#endif
	    setDocument(Simlet.MOD_AUTH, null);
	    execNext();
	    break;
	case Executable.STATE_NEXT:
	    //#ifdef DEBUG_MODAUTH
	    //# System.out.println("\tExecutable.STATE_NEXT");
	    //#endif
	    m_DocAuth.save();
	    execNext();
	    break;
        }

	//#ifdef DEBUG_MODAUTH
	//# System.out.println("ModAuht::work() EXITING");
	//#endif
    }
    
    protected void formGoToNext() {
	byte[] login;

        //#ifdef DEBUG_MODAUTH
        //# System.out.println("ModAuht::formGoToNext() ENTERED");
        //#endif
        // Se obtiene el resultado de la obtención de datos
        getOptions(m_StrLogin, Utils.TOKEN, Utils.TOKEN_PIPE, 1);
        
        login = m_StrLogin.toString().getBytes();        
        m_DocAuth.setLogin(login, 0, login.length);
        
        execQueue(this, this);
        exec(createModule(ModAuth.MOD_LOGIN));
        //#ifdef DEBUG_MODAUTH
        //# System.out.println("ModAuht::formGotoNext() EXITING");
        //#endif
    }
    
    protected void formGoToExit() {
        //#ifdef DEBUG_MODAUTH
        //# System.out.println("ModAuht::formGoToExit() ENTERED");
        //#endif
        
        // Documento DocAuth fuera de la memoria
        setDocument(Simlet.MOD_AUTH, null);
        // Documento DocPref fuera de la memoria
        setDocument(Simlet.MOD_PREF, null);
        // Documento DocPref fuera del disco.
        DocPref.delete();
        // Deja a init que llame a Pref.
        execNext();
        //#ifdef DEBUG_MODAUTH
        //# System.out.println("ModAuht::formGoToExit() EXITING");
        //#endif
    }
    
}
